home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / 目覚まし時計 / ALARM.C next >
Text File  |  1994-03-10  |  14KB  |  449 lines

  1. /******************************************************************************
  2.  *    alarm.c:    目覚まし時計の処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <iocslib.h>
  10. #include <music3.h>        /* OPMDRV3.X を使用する時に必要        */
  11. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  12. #include <event.h>        /* イベントマンを利用するときに必要    */
  13. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  14. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  15. #include <control.h>        /* コントロールマンを利用するときに必要    */
  16. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  17. #include <text.h>        /* テキストマンを利用するときに必要    */
  18. #include <task.h>        /* タスクマンを利用するときに必要    */
  19. #include "alarm.h"        /* このプログラム固有のヘッダファイル    */
  20. #include "alchart.h"
  21.  
  22. /******************************************************************************
  23.  *    dragIcon():    アイコン表示の時のドラッグ処理
  24.  ******************************************************************************
  25.  *    引数:    ComVal *pcv        共通変数へのポインタ
  26.  *        BOOLEAN dClickFlag    ダブルクリックフラグ
  27.  *                    = TRUE:  ダブルクリック
  28.  *                    = FALSE: シングルクリック
  29.  *    戻り値:    BOOLEAN         = TRUE:  処理完了
  30.  *                    = FALSE: 作成失敗(終了)
  31.  */
  32. BOOLEAN dragIcon(ComVal *pcv, BOOLEAN dClickFlag)
  33. {
  34.     Point rpt, ipt;
  35.     Rect rc;
  36.     Region **rgnHdl;
  37.     Graph gr;
  38.  
  39.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  40.     /* Windowのrectをグローバル座標系に変換する */
  41.     rc = pcv->windowPtr->graph.rect;
  42.     GMSlideRect(&rc, GMLocalToGlobal(0));
  43.     rgnHdl = GMNewRgn();
  44.     if (rgnHdl == NULL) {
  45.         pcv->errorCode = 8;    /* 確保できなかった        */
  46.         return FALSE;        /* 失敗したのでFALSEを返す    */
  47.     }
  48.     GMRectRgn(rgnHdl, &rc);
  49.  
  50.     /* 表示画面全体を示すGraphを作成 */
  51.     GMOpenGraph(G_TXT, &gr);
  52.     GMSetGraph(&gr);
  53.     rpt.x_y = WMDragRgn(rgnHdl, pcv->event.ev.where.x_y, &gr.rect, &gr.rect, 3, NULL);
  54.     GMDisposeRgn(rgnHdl);        /* リージョンハンドルを解放する    */
  55.  
  56.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  57.     /* 移動量有る場合は、ウィンドウの移動処理 */
  58.     if (rpt.x_y != 0) {
  59.         ipt.x_y = GMLocalToGlobal(0);
  60.         ipt.p.x += rpt.p.x;
  61.         ipt.p.y += rpt.p.y;
  62.         WMMove(pcv->windowPtr, ipt.x_y, 0);
  63.  
  64.     /* 移動量0で、ダブルクリックの場合は、ウィンドウ化 */
  65.     } else if (dClickFlag)
  66.         if (!gotoWindow(pcv))
  67.             return FALSE;    /* 失敗したのでFALSEを返す    */
  68.  
  69.     GMCloseGraph(&gr);
  70.     return TRUE;            /* 処理が完了したのでTRUEを返す    */
  71. }
  72.  
  73. /******************************************************************************
  74.  *    gotoWindow():    アイコン表示からウィンドウに戻す
  75.  ******************************************************************************
  76.  *    引数:    ComVal *pcv    共通変数へのポインタ
  77.  *    戻り値:    BOOLEAN        = TRUE:  処理完了
  78.  *                = FALSE: 作成失敗(終了)
  79.  */
  80. BOOLEAN gotoWindow(ComVal *pcv)
  81. {
  82.     Point pt;
  83.     Rect rc;
  84.  
  85.     static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
  86.  
  87.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  88.     /* アイコンの左上座標を待避 */
  89.     pt.x_y = GMLocalToGlobal(0);
  90.     rc = winSize;
  91.     /* ウィンドウ位置を変更 */
  92.     GMSlideRect(&rc, LONGWORD(pt.p.x - rc.d.left, pt.p.y - rc.d.top));
  93.     WMDispose(pcv->windowPtr);
  94.  
  95.     pcv->windowPtr = WMOpen(NULL, &rc, WINTITLE,
  96.         FALSE, WI_STD2 << 4, W_FRONT, TRUE, TSGetID());
  97.     if (pcv->windowPtr == NULL) {
  98.         pcv->errorCode = 2;    /* 作成できなかった        */
  99.         return FALSE;        /* 失敗したのでFALSEを返す    */
  100.     }
  101.  
  102.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  103.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  104.     GMForeColor(G_BLACK);
  105.     GMBackColor(G_LGRAY);
  106.  
  107.     pcv->setBtnHdl = CMOpen(pcv->windowPtr, &rcSetBtn,
  108.         (_LASCII)"\x04設定", TRUE, 0, 0, 1, CI_CHRBTN << 4, 0);
  109.     if (pcv->setBtnHdl == NULL) {
  110.         pcv->errorCode = 3;    /* 作成できなかった        */
  111.         return FALSE;        /* 失敗したのでFALSEを返す    */
  112.     }
  113.  
  114.     (*pcv->setBtnHdl)->hilite = 0;    /* [設定]ボタンを使用可能に    */
  115.     CMDraw(pcv->windowPtr);
  116.     if (!createText(pcv)) {        /* テキストエディットを作成する    */
  117.         pcv->errorCode = 4;    /* 作成できなかった        */
  118.         return FALSE;        /* 失敗したのでFALSEを返す    */
  119.     }
  120.  
  121.     WMShow(pcv->windowPtr);        /* ウィンドウを表示する        */
  122.     /* テキストエディットの表示モードをオンにする */
  123.     TMShow(pcv->tEditHdl);
  124.     pcv->iconFlag = FALSE;
  125.     return TRUE;            /* 処理が完了したのでTRUEを返す    */
  126. }
  127.  
  128. /******************************************************************************
  129.  *    gotoIcon():    ウィンドウをアイコン表示に変更
  130.  ******************************************************************************
  131.  *    引数:    ComVal *pcv    共通変数へのポインタ
  132.  *    戻り値:    BOOLEAN        = TRUE:  処理完了
  133.  *                = FALSE: 作成失敗(終了)
  134.  */
  135. BOOLEAN gotoIcon(ComVal *pcv)
  136. {
  137.     LPoint lpt;
  138.     Rect rc;
  139.  
  140.     /* アイコンサイズ */
  141.     static Rect icnsize = { 0, 0, ICNSIZE_H, ICNSIZE_V };
  142.  
  143.     CMKill(pcv->windowPtr);
  144.     if (pcv->tEditHdl != NULL) {
  145.         TMCaret(pcv->tEditHdl, 0); /* カーソルを消去する    */
  146.         /* テキストエディットハンドルを廃棄する */
  147.         TMDispose(pcv->tEditHdl);
  148.         pcv->tEditHdl = NULL;
  149.     }
  150.  
  151.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  152.     /* アイコンの左上座標を待避 */
  153.     lpt = GMLocalToGlobal(0);
  154.     rc = icnsize;
  155.     GMSlideRect(&rc, lpt);
  156.     WMDispose(pcv->windowPtr);
  157.  
  158.     pcv->windowPtr = WMOpen(NULL, &rc, WINTITLE,
  159.         TRUE, WI_PLN << 4, W_FRONT, TRUE, TSGetID());
  160.     if (pcv->windowPtr == NULL) {
  161.         pcv->errorCode = 2;    /* 作成できなかった        */
  162.         return FALSE;        /* 失敗したのでFALSEを返す    */
  163.     }
  164.  
  165.     pcv->iconFlag = TRUE;
  166.     return TRUE;            /* 処理が完了したのでTRUEを返す    */
  167. }
  168.  
  169. /******************************************************************************
  170.  *    turnClock():    指定時刻になった時のアニメーション処理
  171.  ******************************************************************************
  172.  *    引数:    ComVal *pcv    共通変数へのポインタ
  173.  */
  174. void turnClock(ComVal *pcv)
  175. {
  176.     char str[16];
  177.  
  178.     if (pcv->animaMode < CHART_ENT) {    /* コマ毎のループ        */
  179.         GMForeColor(G_LGRAY);
  180.         GMFillRect(&rcErace);
  181.         putUdPat3(pcv, pcv->iconImg[animaChart[pcv->animaMode].patID], animaChart[pcv->animaMode].pos.x_y);
  182.         GMForeColor(G_BLACK);
  183.         if (animaChart[pcv->animaMode].flag == 1) /* 効果音付きのコマの場合 */
  184.             m_mplay(-1);
  185.         if (animaChart[pcv->animaMode].flag == 2) { /* 効果音を止めるコマの場合 */
  186.             m_mstop(-1);
  187.             m_enable(0);
  188.         }
  189.         pcv->animaWait = animaChart[pcv->animaMode].offTime + EMSysTime();
  190.         pcv->animaMode++;
  191.     } else {
  192.         /* アニメーションの終了 */
  193.         MMHdlUnlock(pcv->pcmDataHdl);
  194.         restorePcm(pcv);
  195.         GMFontSize(LONGWORD(10, 10)); /* 現在時刻の表示    */
  196.         GMForeColor(G_LGRAY);
  197.         GMFillRect(&rcErace);
  198.         putUdPat3(pcv, pcv->iconImg[0], LONGWORD(0, 8));
  199.         GMForeColor(G_BLACK);
  200.         GMMove(LONGWORD(20, 24));
  201.         sprintf(str, "%02d:%02d\0", LOWBYTE(HIWORD(pcv->nowTime)), HIBYTE(pcv->nowTime));
  202.         GMDrawStrZ(str);
  203.         pcv->animaMode = -1;
  204.     }
  205. }
  206.  
  207. /******************************************************************************
  208.  *    checkAlarmTime():    入力された時刻をチェック
  209.  ******************************************************************************
  210.  *    引数:    ComVal *pcv    共通変数へのポインタ
  211.  *    戻り値:    BOOLEAN        = TRUE:  正常
  212.  *                = FALSE: 入力された時刻が異常
  213.  */
  214. BOOLEAN checkAlarmTime(ComVal *pcv)
  215. {
  216.     int len, i;
  217.     char str[16];
  218.  
  219.     len = TMGetText(pcv->tEditHdl, str, TEXT_LEN);
  220.     if (len == TEXT_LEN) {
  221.         for (i = 0; i < TEXT_LEN; i++)
  222.             if (i == 2) {
  223.                 if (str[i] != ':')
  224.                     break;
  225.             } else if (str[i] < '0' || str[i] > '9')
  226.                 break;
  227.         if (i >= TEXT_LEN) {
  228.             i = atoi(str);
  229.             if (i >= 0 && i <= 23) {
  230.                 i = atoi(&str[3]);
  231.                 if (i >= 0 && i <= 59) {
  232.                     pcv->alarmTime = (A2BYTE(str[0], str[1]) << 16) | (A2BYTE(str[3], str[4]) << 8);
  233.                     return TRUE;
  234.                 }
  235.             }
  236.         }
  237.     }
  238.  
  239.     DMError(D_CONFIRM, "入力された時間は、正しくありません。");
  240.     return FALSE;
  241. }
  242.  
  243. /******************************************************************************
  244.  *    putUdPat3():    レクタングルイメージのデータを下ぞろえで表示する
  245.  ******************************************************************************
  246.  *    引数:    ComVal *pcv        共通変数へのポインタ
  247.  *        RectImg **rImgHdl    レクタングルイメージハンドル
  248.  *        LPoint lpt        表示座標
  249.  */
  250. void putUdPat3(ComVal *pcv, RectImg **rImgHdl, LPoint lpt)
  251. {
  252.     Rect rc;
  253.     RectImg *iptr;
  254.  
  255.     MMHdlLock(rImgHdl);
  256.     iptr = *rImgHdl;
  257.     rc = iptr->bounds;
  258.     GMSlideRect(&rc, lpt);
  259.  
  260.     GMPlotImg(iptr->data, &rc, 0);
  261.     MMHdlUnlock(rImgHdl);
  262. }
  263.  
  264. /******************************************************************************
  265.  *    getPcmChannel():    OPMDRV3のPCMのチャンネル番号を求める
  266.  ******************************************************************************
  267.  *    戻り値:    char num    チャンネル番号(1~25)
  268.  */
  269. char getPcmChannel(void)
  270. {
  271.     int mode;
  272.     char num;
  273.  
  274.     mode = m_sysch((char *) -1);
  275.     switch(mode) {
  276.     case 0:
  277.         num = 9;
  278.         break;
  279.     case 1:
  280.         num = 25;
  281.         break;
  282.     case 2:
  283.         num = 25;
  284.         break;
  285.     case 3:
  286.         num = 17;
  287.         break;
  288.     case 4:
  289.         num = 1;
  290.         break;
  291.     case 5:
  292.         num = 1;
  293.         break;
  294.     default:
  295.         num = -1;
  296.         break;
  297.     }
  298.  
  299.     return num;
  300. }
  301.  
  302. /******************************************************************************
  303.  *    backupPcm():    OPMDRV3.Xに登録されているPCMデータを退避する
  304.  ******************************************************************************
  305.  *    引数:    ComVal *pcv    共通変数へのポインタ
  306.  *    戻り値:    BOOLEAN        = TRUE:  退避成功
  307.  *                = FALSE: 退避失敗
  308.  */
  309. BOOLEAN backupPcm(ComVal *pcv)
  310. {
  311.     int len, slen = 0;
  312.     int errCode, i;
  313.     char dmypcm[10];
  314.  
  315.     len = m_pcmlen(PCMNOTENO);
  316.     if (len != 0) {
  317.         pcv->pcmBufHdl[PCMNOTENO] = MMChHdlNew(len + 4);
  318.         if (pcv->pcmBufHdl[PCMNOTENO] == NULL)
  319.             /* メモリが不足している */
  320.             return FALSE;
  321.  
  322.         /* 登録したいノート番号のPCMデータを保存 */
  323.         *(long *) *pcv->pcmBufHdl[PCMNOTENO] = len;
  324.         m_pcmget(PCMNOTENO, *pcv->pcmBufHdl[PCMNOTENO] + 4, len);
  325.         /* PCMデータをクリア */
  326.         m_pcmset(PCMNOTENO, 4, 0, dmypcm);
  327.     } else 
  328.         pcv->pcmBufHdl[PCMNOTENO] = NULL;
  329.  
  330.     /* ベルのPCMデータを登録 */
  331.     m_pcmset(PCMNOTENO, 4, PCMLENGTH, *pcv->pcmDataHdl);
  332.     errCode = m_errget();
  333.     if (errCode == 0)
  334.         /* 正常終了 */
  335.         return TRUE;
  336.  
  337.     /* 登録できなければすでに登録済みのデータを一時的に退避して登録 */
  338.     for (i = 0 ; i < 128 ; i++) {
  339.         if (i != PCMNOTENO) {
  340.             len = m_pcmlen(i);
  341.             if (len) {
  342.                 pcv->pcmBufHdl[i] = MMChHdlNew(len + 4);
  343.                 if (pcv->pcmBufHdl[i] == NULL)
  344.                     /* メモリが不足している */
  345.                     return FALSE;
  346.  
  347.                 *(long *) *pcv->pcmBufHdl[i] = len;
  348.                 m_pcmget((char) i, *pcv->pcmBufHdl[i] + 4, len);
  349.                 /* PCMデータをクリア */
  350.                 m_pcmset((char) i, 4, 0, dmypcm);
  351.                 slen += len;
  352.                 if (slen > PCMLENGTH)
  353.                     /* 必要な容量だけ退避が済んだので終了 */
  354.                     break;
  355.             } else
  356.                 /* 未登録のノート番号の場合 */
  357.                 pcv->pcmBufHdl[i] = NULL;
  358.         }
  359.     }
  360.     /* ベルのPCMデータを登録 */
  361.     m_pcmset(PCMNOTENO, 4, PCMLENGTH, *pcv->pcmDataHdl);
  362.     errCode = m_errget();
  363.     if (i >= 128 || errCode < 0)
  364.         /* 最後まで容量が確保できない */
  365.         return FALSE;
  366.  
  367.     return TRUE;
  368. }
  369.  
  370. /******************************************************************************
  371.  *    restorePcm():    退避されているバックアップデータを元に戻す
  372.  ******************************************************************************
  373.  *    引数:    ComVal *pcv    共通変数へのポインタ
  374.  */
  375. void restorePcm(ComVal *pcv)
  376. {
  377.     int i, flag = FALSE;
  378.     char dmypcm[10];
  379.  
  380.     for (i = 0 ; i < 128 ; i++) {
  381.         if (pcv->pcmBufHdl[i] != NULL) {
  382.             if (!flag) {
  383.                 /* ベルのPCMデータをクリア */
  384.                 m_pcmset(PCMNOTENO, 4, 0, dmypcm);
  385.                 flag = TRUE;
  386.             }
  387.             /* 退避されたPCMデータを再設定 */
  388.             m_pcmset((char) i, 4, *(long *) *pcv->pcmBufHdl[i], *pcv->pcmBufHdl[i] + 4);
  389.             MMHdlDispose(pcv->pcmBufHdl[i]); /* ハンドルを解放する */
  390.             pcv->pcmBufHdl[i] = NULL;
  391.         }
  392.     }
  393. }
  394.  
  395. /******************************************************************************
  396.  *    loadPcm():    PCMファイルの読み込み
  397.  ******************************************************************************
  398.  *    引数:    ComVal *pcv    共通変数へのポインタ
  399.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  400.  *                = FALSE: 読み込み失敗
  401.  */
  402. BOOLEAN loadPcm(ComVal *pcv)
  403. {
  404.     int errCode, len;
  405.     int fSize;            /* PCMファイルの大きさ    */
  406.     FILE *fp;
  407.     Task task;            /* タスク管理レコード        */
  408.     char drv[2], path[65], node[19], ext[5], nWork[23];
  409.     char szFile[TS_NAMEMAX];    /* フルパスでファイル名が戻るバッファ */
  410.  
  411.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  412.     strsfn(task.name, drv, path, node, ext); /* タスク名を分解する    */
  413.     strcpy(nWork, node);        /* タスク名よりファイル名を作成する */
  414.     strcat(nWork, ".PCM");
  415.     strmfn(szFile, drv, path, "", ""); /* 検索パスを作成する    */
  416.     /* ファイルを検索する */
  417.     errCode = TSSearchFile(nWork, szFile, szFile);
  418.     if (errCode < 0) {        /* ファイルが見付からない */
  419.         sprintf(szFile, "ファイル「%s」が\r見付かりません。\x00", nWork);
  420.         DMError(D_CONFIRM, szFile);
  421.         return FALSE;
  422.     }
  423.     fp = fopen(szFile, "rb");    /* PCMファイルをオープン */
  424.     if (!fp) {    /* オープンに失敗 */
  425.         DMError(D_CONFIRM, "PCMファイルの読み込みに\r"
  426.                    "失敗しました。");
  427.         return FALSE;
  428.     }
  429.     fseek(fp, 0, SEEK_END);
  430.     fSize = ftell(fp);
  431.     fseek(fp, 0, SEEK_SET);
  432.     pcv->pcmDataHdl = MMChHdlNew(fSize);
  433.     if (pcv->pcmDataHdl == NULL) {
  434.         DMError(D_CONFIRM, "メモリが確保できません。");
  435.         return FALSE;
  436.     }
  437.     MMHdlLock(pcv->pcmDataHdl);
  438.     len = fread(*pcv->pcmDataHdl, sizeof(char), (size_t) fSize, fp);
  439.     MMHdlUnlock(pcv->pcmDataHdl);
  440.     if (len != fSize) {
  441.         DMError(D_CONFIRM, "PCMファイルの読み込みに\r"
  442.                    "失敗しました。");
  443.         return FALSE;
  444.     }
  445.  
  446.     fclose(fp);
  447.     return TRUE;
  448. }
  449.